/**
 * 
 */
package co.edu.javeriana.ia.ga;

/**
 * <p>
 * Permite mapear un conjunto de frecuencias continuas, a un conjunto
 * de frecuencias discretas
 * </p>
 * 
 * @author <a href=f.triana@javeriana.edu.co">Alejandro Triana</a>
 * @version 1.0
 */
public class FrecuencyMapping {
	
	/**
	 * <p>
	 * Realiza el mapeo de la frecuencia
	 * </p>
	 */
	public static int mapping(double frecuency) {
		
		FrecuencyRange[] range = getRange();
		
		for (FrecuencyRange frecuencyRange : range) {
			if(frecuency >= frecuencyRange.minRange && frecuency < frecuencyRange.maxRange) {
				return frecuencyRange.index;
			}
		}

		// Caso para evaluar el intervalo superior cerrado
		return range[range.length - 1].index;
	}
	
	
	/**
	 * <p>
	 * Rangos de frecuencia utilizados en la discretizacion
	 * </p>
	 */
	public static FrecuencyRange[] getRange2() {
		FrecuencyRange[] frecuencies = {
			new FrecuencyRange(1, 0, 0.125),
			new FrecuencyRange(2, 0.125, 0.25),
			new FrecuencyRange(3, 0.25, 0.375),
			new FrecuencyRange(4, 0.375, 0.5),
			new FrecuencyRange(5, 0.5, 0.625),
			new FrecuencyRange(6, 0.625, 0.75),
			new FrecuencyRange(7, 0.75, 0.875),
			new FrecuencyRange(8, 0.875, 1),
		};
		return frecuencies;
	}
	public static FrecuencyRange[] getRange() {
		FrecuencyRange[] frecuencies = {
			new FrecuencyRange(1, 0, 0.25),
			new FrecuencyRange(2, 0.25, 0.5),
			new FrecuencyRange(3, 0.5, 0.75),
			new FrecuencyRange(4, 0.75, 0.1),
			
		};
		return frecuencies;
	}
	
	/**
	 * <p>
	 * Realiza el mapeo de la frecuencia
	 * </p>
	 */
	static class FrecuencyRange {
		
		private int index;
		
		private double minRange;
		
		private double maxRange;
		
		public FrecuencyRange(int index, double minRange, double maxRange) {
			this.index = index;
			this.minRange = minRange;
			this.maxRange = maxRange;
		}

		public double getMinRange() {
			return minRange;
		}

		public void setMinRange(double minimumRange) {
			this.minRange = minimumRange;
		}

		public double getMaxRange() {
			return maxRange;
		}

		public void setMaxRange(double maximunRange) {
			this.maxRange = maximunRange;
		}

		public int getIndex() {
			return index;
		}

		public void setIndex(int index) {
			this.index = index;
		}
	}
}
